水管工遊戲

1、題目
水管工遊戲是指如下圖中的矩陣中,一共有兩種管道,一個是直的,一個是彎的,所有管道都可以自由旋轉,最終就是要連通入水口可出水口。其中的樹爲障礙物。
在這裏插入圖片描述

在這裏插入圖片描述
2、算法思路
本題使用的是深度優先搜索算法,先標識入水口方向,在每次探索新管道的時候上根據入水口方向進行擴展,然後根據管道的類型來判斷下一個節點的入水口方向。

代碼實現:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,m,flag,book[51][51];
struct note{
	int x,y;
}s[100];
int top=0;
void dfs(int x,int y,int front)
{
	int i;
	if(x==n&&y==m+1)
	{
		flag=1;
		for(int i=1;i<=top;i++)
		{
			printf("%d,%d\n",s[i].x,s[i].y);
		}
		return;
	}
	if(x<1||x>n||y>m||y<1)
	{
		return ;
	}
	if(book[x][y]==1)
		return ;
		book[x][y]=1;
		top++;
		s[top].x=x;
		s[top].y=y;
		if(a[x][y]>=5&&a[x][y]<=6)
		{
			if(front==1)
			{
				dfs(x,y+1,1);
			}
			if(front==2)
			{
				dfs(x+1,y,2);
			}
			if(front==3)
			{
				dfs(x,y-1,3);
			}
			if(front==4)
			{
				dfs(x-1,y,4);
			}
		}else if(a[x][y]>=1&&a[x][y]<=4){
			if(front==1)
			{
				dfs(x+1,y,2);
				dfs(x-1,y,4);
			}
			if(front==2)
			{
				dfs(x,y+1,1);
				dfs(x,y-1,3);
			}
			if(front==4)
			{
				dfs(x,y+1,1);
				dfs(x,y-1,3);
			}
			if(front==3)
			{
				dfs(x+1,y,2);
				dfs(x-1,y,4);
			}
		}
	book[x][y]=0;
	top--;
	return ;	
}
int main(){
	int num=0;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			cin>>a[i][j];
		}
	}
	dfs(1,1,1);
	if(flag==0)
		cout<<"沒有";
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章